package main

import (
	"github.com/gin-gonic/gin"
	"log"
	"time"
)

func main() {
	r := gin.Default()

	//通过Use方法使用中间件

	//日志中间件
	r.Use(gin.Logger())
	//Recovery中间件，防止程序因panic崩掉
	r.Use(gin.Recovery())
	//自定义中间件
	r.Use(Logger())

	//处理器函数
	r.GET("/hi", func(c *gin.Context) {
		//获取存在上下文中的值
		s := c.MustGet("example").(string)
		log.Println("handler:", s)
	})

	//自定义中间件
	r.Run(":8080")
}

func Logger() gin.HandlerFunc {
	return func(c *gin.Context) {
		t := time.Now()
		//将一些数据存在上下文中
		c.Set("example", "这是一个中间件数据")
		//这里处理请求到达处理器函数之前的逻辑
		log.Println("middleware: 预处理...")
		//调用下一个中间件，或者处理器函数
		c.Next()
		//在这里处理响应返回给客户端之前的逻辑，如记录请求时间
		duration := time.Since(t)
		log.Print("middleware: 请求处理时间=", duration)
		//如查询请求状态码
		status := c.Writer.Status()
		log.Println("middleware: 响应状态码", status)
	}
}
